import 'dart:math' show pow;

import 'package:intl/intl.dart';

extension IntExt on int {
  String formatWNumber() {
    if (this >= 10000) {
      double formatted = this / 10000;
      return '${formatted.toStringAsFixed(1)}w';
    }
    return toString();
  }

  String ymd() {
    DateTime dateTime = DateTime.fromMillisecondsSinceEpoch(this * 1000);
    String formattedDate = "${dateTime.year}-${dateTime.month}-${dateTime.day}";
    return formattedDate;
  }
}

extension NumExt on num? {
  String formatWithComma() {
    double? number = double.tryParse('$this');
    if (number == null) return '--'; // 处理无效输入
    String formattedNumber = number.toStringAsFixed(number % 1 == 0 ? 0 : 2); // 根据小数部分是否为0来决定是否显示小数

    // 使用正则表达式，每四位插入空格
    RegExp regExp = RegExp(r'(\d{1,3})(?=(\d{3})+(?!\d))');
    String integerPart = formattedNumber.split(',')[0];
    String formattedInteger = integerPart.replaceAllMapped(regExp, (Match match) => '${match[1]},');

    // 如果有小数部分，拼接小数部分
    if (formattedNumber.contains(',')) {
      String decimalPart = formattedNumber.split(',')[1];
      return '$formattedInteger.$decimalPart';
    }

    return formattedInteger;
  }

  num? notZero() {
    return this == 0 ? null : this;
  }

  //保留x位小数（截取）
  String keepDecimal({int decimalPlaces = 1}) {
    if (this == null) {
      return '0';
    }

    abortZero(String number) {
      if (number.endsWith("0") && number.contains(".")) {
        return abortZero(number.substring(0, number.length - 1));
      } else if (number.endsWith(".")) {
        return number.substring(0, number.length - 1);
      } else {
        return number;
      }
    }

    // 如果想四舍五入，需要在第一次乘法后进行floor
    return abortZero("${this == null ? 0 : this!.toStringAsFixed(decimalPlaces)}");
  }

  String formatNumber({int decimalPlaces = 1, bool floor = true, bool onlyFormatted = false}) {
    final formatter = NumberFormat.decimalPattern();

    if (this == null) {
      return '0';
    }
    if (onlyFormatted) {
      return formatter.format(floor ? this!.floor() : this!);
    }
    if (this! >= 1e9) {
      double valueInB = this! / 1e9;
      return '${(valueInB * pow(10, decimalPlaces)).truncateToDouble() / pow(10, decimalPlaces)}B';
    } else if (this! >= 1e6) {
      double valueInM = this! / 1e6;
      return '${(valueInM * pow(10, decimalPlaces)).truncateToDouble() / pow(10, decimalPlaces)}M';
    } else if (this! >= 1e4) {
      double valueInK = this! / 1e3;
      return '${(valueInK * pow(10, decimalPlaces)).truncateToDouble() / pow(10, decimalPlaces)}K';
    } else {
      return formatter.format(floor ? this!.floor() : this!);
    }
  }
}
